package com.adisi.bd;

import java.math.BigDecimal;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import com.adisi.objetos.Alerta;
import com.adisi.objetos.EstadoAlerta;
import com.adisi.objetos.Usuario;

public class AlertaDatos {

	public Alerta conseguirUnaAlerta(String objeto, int idObjeto, String motivo, EstadoAlerta estado) throws Exception {
		
		Alerta alerta = null;
		Connection con = null;
		Coneccion coneccion = new Coneccion();
		ResultSet rs = null;
		
		CallableStatement sp = null;
		
		try {
			con = coneccion.conectar();
			
			sp = con.prepareCall("{call sp_Alerta_Select(?,?,?,?)}");
			
			sp.setString("objeto_alerta", objeto);
			sp.setInt("id_objeto_alerta", idObjeto);
			sp.setString("estado_alerta", estado.toString());
			sp.setString("motivo_alerta", motivo);
			
			sp.execute();
			
			rs = sp.getResultSet();
			while (rs.next()) {
				
				alerta = new Alerta(
						rs.getInt("id_alerta")
						,objeto
						,idObjeto
						,motivo
						,rs.getString("tipo_alerta").charAt(0)
						,rs.getBigDecimal("km_alerta")
						,rs.getDate("fecha_alerta")
						,estado
						,rs.getInt("id_usuario")
						,rs.getDate("fecha")
						);
				
				break;
				
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();			
		} finally {
			try {
				rs.close();
				sp.close();
				con.close();
			} catch (SQLException e) {
				System.out.println("problema al cerrar");
			}
		}
		return alerta;	
	}

	public Alerta conseguirUnaAlerta(int idAlerta) throws Exception {
		
		Alerta alerta = null;
		Connection con = null;
		Coneccion coneccion = new Coneccion();
		ResultSet rs = null;
		
		CallableStatement sp = null;
		
		try {
			con = coneccion.conectar();
			
			sp = con.prepareCall("{call sp_Alerta_Select_x_Id(?)}");
			
			sp.setInt("id_alerta", idAlerta);
			
			sp.execute();
			
			rs = sp.getResultSet();
			while (rs.next()) {
				
				alerta = new Alerta(
						rs.getInt("id_alerta")
						,rs.getString("objeto_alerta")
						,rs.getInt("id_objeto_alerta")
						,rs.getString("motivo_alerta")
						,rs.getString("tipo_alerta").charAt(0)
						,rs.getBigDecimal("km_alerta")
						,rs.getDate("fecha_alerta")
						,EstadoAlerta.valueOf(rs.getString("estado_alerta"))
						,rs.getInt("id_usuario")
						,rs.getDate("fecha")
						);
				
				break;
				
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();			
		} finally {
			try {
				rs.close();
				sp.close();
				con.close();
			} catch (SQLException e) {
				System.out.println("problema al cerrar");
			}
		}
		return alerta;	
	}
	
	public boolean actualizarAlerta(Alerta alerta, EstadoAlerta nuevoEstado, BigDecimal nuevoKmAlerta, Date nuevaFechaAlerta, Usuario usuario) {
		
		return actualizarAlerta(alerta.getIdAlerta(), nuevoEstado, nuevoKmAlerta, nuevaFechaAlerta, usuario);

	}

	public boolean actualizarAlerta(int idAlerta, EstadoAlerta nuevoEstado, BigDecimal nuevoKmAlerta, Date nuevaFechaAlerta, Usuario usuario) {
		Connection con = null;
		
		Coneccion coneccion = new Coneccion();
		
		CallableStatement sp = null;
		
		boolean ok = false;

		try {
			con = coneccion.conectar();
			sp = con.prepareCall("{call sp_Alerta_Update(?,?,?,?,?)}");
			
			sp.setInt("id_alerta", idAlerta);
			
			if(nuevoEstado!=null)
				sp.setString("estado_alerta", nuevoEstado.toString());
			else 
				sp.setNull("estado_alerta", java.sql.Types.VARCHAR);
			
			if(nuevoKmAlerta!=null)
				sp.setBigDecimal("km_alerta", nuevoKmAlerta);
			else
				sp.setNull("km_alerta", java.sql.Types.INTEGER);
			
			if(nuevaFechaAlerta!=null)
				sp.setDate(	"fecha_alerta", new java.sql.Date(nuevaFechaAlerta.getTime()));
			else
				sp.setNull("fecha_alerta", java.sql.Types.DATE);						
			
			sp.setInt("id_usuario", usuario.getIdUsuario());
			
			sp.execute();  
			
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			ok = true;
			try {
				sp.close();
				con.close();
			} catch (SQLException e) {
				System.out.println("problema al cerrar");
			}
		}
		return ok;		

	}	
	
	public int grabarNuevaAlerta(Alerta alerta) {
		Connection con = null;
		
		Coneccion coneccion = new Coneccion();
		
		CallableStatement sp = null;
		
		int ok = 0;
		
		try {
			
			con = coneccion.conectar();
			
				sp = con.prepareCall("{? = call sp_Alerta_Insert(?,?,?,?,?,?,?,?)}");
				
				sp.registerOutParameter(1, java.sql.Types.INTEGER);
				
				sp.setString("objeto_alerta", alerta.getObjeto());
				sp.setInt("id_objeto_alerta", alerta.getIdObjeto());
				sp.setString("motivo_alerta", alerta.getMotivoAlerta());
				sp.setString("tipo_alerta", String.valueOf(alerta.getTipoAlerta()));
				
				if(alerta.getKmAlerta()!=null)
					sp.setBigDecimal("km_alerta", alerta.getKmAlerta());
				else
					sp.setNull("km_alerta", java.sql.Types.INTEGER);
				
				if(alerta.getFechaAlerta()!=null)
					sp.setDate(	"fecha_alerta", new java.sql.Date(alerta.getFechaAlerta().getTime()));
				else
					sp.setNull("fecha_alerta", java.sql.Types.DATE);				
				
				sp.setString("estado_alerta", alerta.getEstado().toString());
				sp.setInt("id_usuario", alerta.getId_usuario());
	
				
				sp.execute();
				
				ok = sp.getInt(1);
				
			
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				sp.close();
				con.close();
			} catch (SQLException e) {
				System.out.println("problema al cerrar");
			}
		}
		return ok;
		
	}

	public ArrayList<Alerta> conseguirTodasLasAlertas(String objeto, int idObjeto, String motivoAlerta, EstadoAlerta estado) {
		ArrayList<Alerta> alertas = new ArrayList<Alerta>();
		Connection con = null;
		Coneccion coneccion = new Coneccion();
		ResultSet rs = null;
		
		CallableStatement sp = null;
		
		try {
			con = coneccion.conectar();
			
			sp = con.prepareCall("{call sp_Alerta_Select(?,?,?,?)}");
			
			if(objeto != null)
				sp.setString("objeto_alerta", objeto);
			else
				sp.setNull("objeto_alerta", java.sql.Types.VARCHAR);
			
			if(idObjeto!=0)
				sp.setInt("id_objeto_alerta", idObjeto);
			else
				sp.setNull("id_objeto_alerta", java.sql.Types.INTEGER);
			
			if(estado!=null)
				sp.setString("estado_alerta", estado.toString());
			else
				sp.setNull("estado_alerta", java.sql.Types.VARCHAR);
			
			if(motivoAlerta!=null)
				sp.setString("motivo_alerta", motivoAlerta);
			else
				sp.setNull("motivo_alerta", java.sql.Types.VARCHAR);
			
			sp.execute();
			
			rs = sp.getResultSet();
			while (rs.next()) {
				
				if(estado!=null || !rs.getString("estado_alerta").equals("ELIMINADA") ) {
				
					Alerta alerta = new Alerta(
							rs.getInt("id_alerta")
							,rs.getString("objeto_alerta")
							,rs.getInt("id_objeto_alerta")
							,rs.getString("motivo_alerta")
							,rs.getString("tipo_alerta").charAt(0)
							,rs.getBigDecimal("km_alerta")
							,rs.getDate("fecha_alerta")
							,EstadoAlerta.valueOf(rs.getString("estado_alerta"))
							,rs.getInt("id_usuario")
							,rs.getDate("fecha")
							);				
					
					alertas.add(alerta);
				}
				
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();			
		} finally {
			try {
				rs.close();
				sp.close();
				con.close();
			} catch (SQLException e) {
				System.out.println("problema al cerrar");
			}
		}
		return alertas;	
	}

	public boolean borrarUnaAlerta(int idAlerta) {
		Connection con = null;
		
		Coneccion coneccion = new Coneccion();
		
		CallableStatement sp = null;
		
		boolean ok = false;

		try {
			con = coneccion.conectar();
			sp = con.prepareCall("{call sp_Alerta_Delete(?)}");
			
			sp.setInt("id_alerta", idAlerta);
			
			sp.execute();  
			
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			ok = true;
			try {
				sp.close();
				con.close();
			} catch (SQLException e) {
				System.out.println("problema al cerrar");
			}
		}
		return ok;
	}
}
